home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 140 / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan).7z / Gekkan Dennou Club - 2000.1 Vol. 140 (Japan) (Track 1).bin / tools / dshell / dsh333bs.lzh / bprint12.s < prev    next >
Text File  |  1999-07-11  |  8KB  |  438 lines

  1. *****************************************************************
  2. *    12ドット文字列描画                    *
  3. *                Copyright 1999 Toshiyuki Murata    *
  4. *****************************************************************
  5.         .include    doscall.mac
  6.         .include    iocscall.mac
  7. *
  8. .ifndef    _FNTADR
  9. _FNTADR    equ    $16
  10. .endif
  11.  
  12.         .xdef    _B_PRINT12
  13.         .xdef    B_PRINT12
  14.  
  15. HOMEADR        equ    $944
  16. CURSOR_XMAX    equ    $970
  17. *CURSOR_YMAX    equ    $972
  18. CURSOR_X    equ    $974
  19. CURSOR_Y    equ    $976
  20. COLOR        equ    $994
  21. *
  22. CRTCR21        equ    $e8002a        *CRTCレジスタ
  23. CRTCR23        equ    $e8002e        *
  24. *
  25. R21        equ    CRTCR21-CRTCR23
  26. R23        equ    CRTCR23-CRTCR23
  27. *
  28.         .offset    4
  29. str:        .ds.l    1
  30. *
  31.         .text
  32.         .even
  33. *
  34. *    int B_PRINT12(const char *str);
  35. *
  36. *    現カーソル位置 (8ドット単位) から文字列 str を 12ドットフォントで表示する
  37. *    次のカーソル x 座標 (8ドット単位) を返す
  38. *
  39. _B_PRINT12:
  40.         movea.l    str(sp),a0
  41.         pea.l    B_PRINT12(pc)
  42.         DOS    _SUPER_JSR
  43.         addq.l    #4,sp
  44.         rts
  45. *
  46. B_PRINT12:
  47. SAVREGS        reg    d3-d7/a4-a5
  48.         movem.l    SAVREGS,-(sp)
  49.  
  50.         IOCS    _B_CUROFF
  51.  
  52.         move.l    CURSOR_Y.w,d7
  53.         clr.w    d7
  54.         lsr.l    #16-11,d7    *y×128×16
  55.         add.l    HOMEADR.w,d7
  56.         movea.l    d7,a1
  57.         move.w    CURSOR_X.w,d0
  58.         move.w    d0,-(sp)
  59.         adda.w    d0,a1
  60.         moveq.l    #7*2,d6
  61.         move.l    a1,d0
  62.         btst.l    #0,d0
  63.         seq.b    d0
  64.         beq    @f
  65.         moveq.l    #3*2,d6
  66.         subq.l    #3,a1
  67.         subq.w    #3,(sp)
  68. @@:        add.w    CURSOR_XMAX.w,d7
  69.         addq.w    #1,d7
  70.         sub.w    a1,d7
  71.         ext.l    d7
  72.         lsl.w    #3,d7
  73.         divu.w    #6,d7
  74.         subq.w    #1,d7
  75.         tst.b    d0
  76.         bne    @f
  77.         subq.w    #4,d7
  78. @@:        lea.l    128*3(a1),a1    *上3ドット, 下1ドットのマージン
  79.         move.l    a1,-(sp)
  80.  
  81.         lea.l    CRTCR23,a5    *a5 = CRTC R23
  82.         move.w    R21(a5),(sp)    *CRTC R21を待避
  83.         moveq.l    #3,d0
  84.         and.b    COLOR.w,d0
  85.         lsl.w    #4,d0
  86.         ori.w    #%11_0000_0000,d0
  87.         move.w    d0,R21(a5)
  88.  
  89. loop:        moveq.l    #0,d1
  90.         move.b    (a0)+,d1    *1バイト取り出す
  91.         bpl    han        *00h~7fhなら1バイト文字
  92.         cmpi.b    #$a0,d1        *80h~9fhなら2バイト文字
  93.         bcs    zen
  94.         cmpi.b    #$e0,d1        *a0h~dfhなら1バイト文字
  95.         bcs    han
  96.                 *e0h~ffhなら2バイト文字
  97. zen:        move.b    d1,-(sp)
  98.         move.w    (sp)+,d1
  99.         move.b    (a0)+,d1    *第2バイトを取り出す
  100.         beq    retn        *2バイト文字の途中で
  101.                     * 文字列が終わっていた
  102.  
  103.         cmpi.w    #$8100,d1    *8000h~80ffhなら2バイト半角
  104.         bcs    hanput        *
  105.         cmpi.w    #$f000,d1    *f000h~ffffhなら2バイト半角
  106.         bcc    hanput
  107.  
  108.         subq.w    #1,d7        *右端までのゆとりが半角分なら
  109.         bcs    retn        * 抜ける
  110.  
  111. *
  112. *    全角文字描画
  113. *
  114. zenput:        moveq.l    #6,d2        *文字パターンを取得
  115.         IOCS    _FNTADR        *
  116.         movea.l    d0,a2        *a2 = 文字パターン
  117.  
  118.         move.w    ztbl(pc,d6.w),d0    *x座標 % 8に応じて
  119.         jsr    ztbl(pc,d0.w)    * 処理を振り分ける
  120.  
  121.         subq.w    #4,d6        *カウンタを更新
  122.         dbcs    d7,loop        *カウンタが負になるか
  123.                     * 画面右端に達するまで繰り返す
  124.         bcc    retn        *カウンタが非負ならば画面右端
  125.  
  126.         addi.w    #8*2,d6        *カウンタを補正
  127.         addq.l    #6,a1        *VRAMアドレスを進める
  128.         dbra    d7,loop        *画面右端に達するまで繰り返す
  129.         *
  130. retn:        move.w    (sp)+,R21(a5)    *CRTC R21を復帰
  131.         move.w    a1,d0
  132.         sub.w    (sp)+,d0    *描画先アドレス移動量
  133.         add.w    diffTable(pc,d6.w),d0
  134.         add.w    (sp)+,d0
  135.         move.w    d0,CURSOR_X.w
  136.         movem.l    (sp)+,SAVREGS
  137.         ext.l    d0
  138.         rts
  139. *
  140.         .dc.w    6    *-1
  141. diffTable:    .dc.w    6    *0
  142.         .dc.w    5    *1
  143.         .dc.w    4    *2
  144.         .dc.w    3    *3
  145.         .dc.w    3    *4
  146.         .dc.w    2    *5
  147.         .dc.w    1    *6
  148.         .dc.w    0    *7
  149.         .dc.w    0    *8
  150. *
  151. ztbl:
  152. q    =    ztbl
  153.         .dc.w    zput7-q
  154.         .dc.w    zput6-q
  155.         .dc.w    zput5-q
  156.         .dc.w    zput4-q
  157.         .dc.w    zput3-q
  158.         .dc.w    zput2-q
  159.         .dc.w    zput1-q
  160.         .dc.w    zput0-q
  161. *
  162. *
  163. *    半角文字描画
  164. *
  165. han:        beq.s    retn
  166.         cmpi.b    #$09,d1
  167.         beq.s    tab
  168. hanput:        moveq.l    #6,d2        *文字パターンを取得
  169.         IOCS    _FNTADR        *
  170.         movea.l    d0,a2        *a2 = 文字パターン
  171.  
  172.         move.w    htbl(pc,d6.w),d0    *x座標 % 8に応じて
  173.         jsr    htbl(pc,d0.w)    * 処理を振り分ける
  174.  
  175.         subq.w    #2,d6        *カウンタを更新
  176.         dbcs    d7,loop        *カウンタが負になるか
  177.                     * 画面右端に達するまで繰り返す
  178.         bcc    retn        *カウンタが非負ならば画面右端
  179.  
  180.         moveq.l    #7*2,d6        *カウンタを初期化
  181.         addq.l    #6,a1        *VRAMアドレスを進める
  182.         dbra    d7,loop        *画面右端に達するまで繰り返す
  183.         bra    retn
  184. *
  185. htbl:
  186. q    =    htbl
  187.         .dc.w    hput7-q
  188.         .dc.w    hput6-q
  189.         .dc.w    hput5-q
  190.         .dc.w    hput4-q
  191.         .dc.w    hput3-q
  192.         .dc.w    hput2-q
  193.         .dc.w    hput1-q
  194.         .dc.w    hput0-q
  195. *
  196. tab:        lsr.w    #1,d6
  197.         addq.w    #1,d6
  198.         move.w    d6,d0
  199.         addq.l    #6,a1
  200.         moveq.l    #7*2,d6
  201.         sub.w    d0,d7
  202.         bcc    loop
  203.         bra    retn
  204.  
  205. *
  206. *    8通りに場合分けした全角文字表示ルーチン
  207. *
  208. zput0:        move.w    #%00000000_00001111,(a5)
  209.  
  210.         move.w    (a2)+,$0000(a1)
  211.         move.w    (a2)+,$0080(a1)
  212.         move.w    (a2)+,$0100(a1)
  213.         move.w    (a2)+,$0180(a1)
  214.         move.w    (a2)+,$0200(a1)
  215.         move.w    (a2)+,$0280(a1)
  216.         move.w    (a2)+,$0300(a1)
  217.         move.w    (a2)+,$0380(a1)
  218.         move.w    (a2)+,$0400(a1)
  219.         move.w    (a2)+,$0480(a1)
  220.         move.w    (a2)+,$0500(a1)
  221.         move.w    (a2)+,$0580(a1)
  222.         rts
  223. *
  224. ZPUT1        macro    ofst
  225.         move.w    (a2)+,d0
  226.         ror.w    d1,d0
  227.         move.w    d2,R23(a5)
  228.         move.w    d0,ofst(a4)
  229.         move.w    d3,R23(a5)
  230.         move.w    d0,ofst+2(a4)
  231.         .endm
  232. *
  233. zput4:        lea.l    2(a1),a4
  234.         moveq.l    #8,d1
  235.         move.w    #%11111111_00000000,d2
  236.         move.w    #%00001111_11111111,d3
  237.         bra    zput10
  238. *
  239. zput1:        movea.l    a1,a4
  240.         moveq.l    #6,d1
  241.         move.w    #%11111100_00000000,d2
  242.         move.w    #%00111111_11111111,d3
  243.  
  244. zput10:        ZPUT1    $0000
  245.         ZPUT1    $0080
  246.         ZPUT1    $0100
  247.         ZPUT1    $0180
  248.         ZPUT1    $0200
  249.         ZPUT1    $0280
  250.         ZPUT1    $0300
  251.         ZPUT1    $0380
  252.         ZPUT1    $0400
  253.         ZPUT1    $0480
  254.         ZPUT1    $0500
  255.         ZPUT1    $0580
  256.         rts
  257. *
  258. ZPUT2        macro    ofst
  259.         move.w    (a2)+,d0
  260.         rol.w    d1,d0
  261.         move.w    d2,R23(a5)
  262.         move.w    d0,ofst(a4)
  263.         move.w    d3,R23(a5)
  264.         move.w    d0,ofst+2(a4)
  265.         .endm
  266. *
  267. zput7:        lea.l    4(a1),a4
  268.         moveq.l    #6,d1
  269.         move.w    #%11111111_11000000,d2
  270.         move.w    #%00000011_11111111,d3
  271.         bra    zput20
  272. *
  273. zput5:        lea.l    2(a1),a4
  274.         moveq.l    #2,d1
  275.         move.w    #%11111111_11111100,d2
  276.         move.w    #%00000000_00111111,d3
  277.         bra    zput20
  278. *
  279. zput2:        movea.l    a1,a4
  280.         moveq.l    #4,d1
  281.         move.w    #%11111111_11110000,d2
  282.         move.w    #%00000000_11111111,d3
  283.  
  284. zput20:        ZPUT2    $0000
  285.         ZPUT2    $0080
  286.         ZPUT2    $0100
  287.         ZPUT2    $0180
  288.         ZPUT2    $0200
  289.         ZPUT2    $0280
  290.         ZPUT2    $0300
  291.         ZPUT2    $0380
  292.         ZPUT2    $0400
  293.         ZPUT2    $0480
  294.         ZPUT2    $0500
  295.         ZPUT2    $0580
  296.         rts
  297. *
  298. ZPUT3        macro    ofst
  299.         move.w    (a2)+,d0
  300.         lsr.w    d1,d0
  301.         move.w    d0,ofst(a4)
  302.         .endm
  303. *
  304. zput6:        move.w    #%11110000_00000000,R23(a5)
  305.         lea.l    4(a1),a4
  306.         moveq.l    #4,d1
  307.         bra    zput30
  308. *
  309. zput3:        move.w    #%11000000_00000011,R23(a5)
  310.         lea.l    2(a1),a4
  311.         moveq.l    #2,d1
  312.  
  313. zput30:        ZPUT3    $0000
  314.         ZPUT3    $0080
  315.         ZPUT3    $0100
  316.         ZPUT3    $0180
  317.         ZPUT3    $0200
  318.         ZPUT3    $0280
  319.         ZPUT3    $0300
  320.         ZPUT3    $0380
  321.         ZPUT3    $0400
  322.         ZPUT3    $0480
  323.         ZPUT3    $0500
  324.         ZPUT3    $0580
  325.         rts
  326.  
  327. *
  328. *    8通りに場合分けした半角文字表示ルーチン
  329. *
  330. hput4:        move.w    #%11111111_00000011,R23(a5)
  331.         lea.l    3(a1),a4
  332.         bra    hput00
  333. *
  334. hput0:        move.w    #%00000011_11111111,R23(a5)
  335.         movea.l    a1,a4
  336.  
  337. hput00:        move.b    (a2)+,(a4)
  338.         move.b    (a2)+,$0080(a4)
  339.         move.b    (a2)+,$0100(a4)
  340.         move.b    (a2)+,$0180(a4)
  341.         move.b    (a2)+,$0200(a4)
  342.         move.b    (a2)+,$0280(a4)
  343.         move.b    (a2)+,$0300(a4)
  344.         move.b    (a2)+,$0380(a4)
  345.         move.b    (a2)+,$0400(a4)
  346.         move.b    (a2)+,$0480(a4)
  347.         move.b    (a2)+,$0500(a4)
  348.         move.b    (a2)+,$0580(a4)
  349.         rts
  350. *
  351. HPUT1        macro    ofst
  352.         move.b    (a2)+,d0
  353.         lsl.w    d1,d0
  354.         move.w    d0,ofst(a4)
  355.         .endm
  356. *
  357. hput6:        move.w    #%11110000_00111111,R23(a5)
  358.         lea.l    4(a1),a4
  359.         moveq.l    #4,d1
  360.         bra    hput10
  361. *
  362. hput1:        move.w    #%11111100_00001111,R23(a5)
  363.         movea.l    a1,a4
  364.         moveq.l    #2,d1
  365.  
  366. hput10:        HPUT1    $0000
  367.         HPUT1    $0080
  368.         HPUT1    $0100
  369.         HPUT1    $0180
  370.         HPUT1    $0200
  371.         HPUT1    $0280
  372.         HPUT1    $0300
  373.         HPUT1    $0380
  374.         HPUT1    $0400
  375.         HPUT1    $0480
  376.         HPUT1    $0500
  377.         HPUT1    $0580
  378.         rts
  379. *
  380. HPUT2        macro    ofst
  381.         move.b    (a2)+,d0
  382.         rol.b    d1,d0
  383.         move.b    d0,ofst(a4)
  384.         move.b    d0,ofst+1(a4)
  385.         .endm
  386. *
  387. hput5:        move.w    #%00001111_11111100,R23(a5)
  388.         lea.l    3(a1),a4
  389.         moveq.l    #2,d1
  390.         bra    hput20
  391. *
  392. hput2:        move.w    #%00111111_11110000,R23(a5)
  393.         lea.l    1(a1),a4
  394.         moveq.l    #4,d1
  395.  
  396. hput20:        HPUT2    $0000
  397.         HPUT2    $0080
  398.         HPUT2    $0100
  399.         HPUT2    $0180
  400.         HPUT2    $0200
  401.         HPUT2    $0280
  402.         HPUT2    $0300
  403.         HPUT2    $0380
  404.         HPUT2    $0400
  405.         HPUT2    $0480
  406.         HPUT2    $0500
  407.         HPUT2    $0580
  408.         rts
  409. *
  410. HPUT3        macro    ofst
  411.         move.b    (a2)+,d0
  412.         lsr.b    #2,d0
  413.         move.b    d0,ofst(a4)
  414.         .endm
  415. *
  416. hput7:        move.w    #%11111111_11000000,R23(a5)
  417.         lea.l    5(a1),a4
  418.         bra    hput30
  419. *
  420. hput3:        move.w    #%11000000_11111111,R23(a5)
  421.         lea.l    2(a1),a4
  422.  
  423. hput30:        HPUT3    $0000
  424.         HPUT3    $0080
  425.         HPUT3    $0100
  426.         HPUT3    $0180
  427.         HPUT3    $0200
  428.         HPUT3    $0280
  429.         HPUT3    $0300
  430.         HPUT3    $0380
  431.         HPUT3    $0400
  432.         HPUT3    $0480
  433.         HPUT3    $0500
  434.         HPUT3    $0580
  435.         rts
  436.  
  437.         .end
  438.